package cn.xu.tool.big.a.compments.strategy;

import cn.xu.tool.big.a.compments.IndicatorCalculator;
import cn.xu.tool.big.a.dto.KLine;

import java.util.List;

/**
 * 类名: TradingStrategy
 * 描述: 5日均线上穿10日均线 金叉 买点
 *      5日均线下传穿10日均线 死叉 卖点
 * 作者: ClarkXu clark2021@qq.com
 * 日期: 2025/7/8
 */
public class TradingStrategy {

    // 双均线策略：短期均线上穿长期均线买入，下穿卖出
    // 返回信号数组：1表示买入，-1表示卖出，0表示无操作
    public static int[] generateSignals(List<KLine> kLines, int shortPeriod, int longPeriod) {

        // 2. 计算指标
        double[] shortMA = IndicatorCalculator.calculateMA(kLines, shortPeriod);  // 5日均线
        double[] longMA = IndicatorCalculator.calculateMA(kLines, longPeriod);   // 20日均线

        int[] signals = new int[shortMA.length];
        // 初始无信号
        for (int i = 0; i < signals.length; i++) {
            signals[i] = 0;
        }

        // 从足够长的位置开始（避免前面有0值）
        int startIndex = 0;
        for (int i = 0; i < shortMA.length; i++) {
            if (shortMA[i] != 0 && longMA[i] != 0) {
                startIndex = i;
                break;
            }
        }

        for (int i = startIndex; i < shortMA.length; i++) {
            // 前一天短均线低于长均线，当天短均线高于长均线 -> 金叉
            if (i > 0 && shortMA[i - 1] < longMA[i - 1] && shortMA[i] > longMA[i]) {
                signals[i] = 1; // 买入信号
                KLine kLine = kLines.get(i);
                System.out.println("金叉 买入信号:【"+kLine.getDate()+"】 收盘价:"+kLine.getClose());
            }
            // 前一天短均线高于长均线，当天短均线低于长均线 -> 死叉
            else if (i > 0 && shortMA[i - 1] > longMA[i - 1] && shortMA[i] < longMA[i]) {
                signals[i] = -1; // 卖出信号
                KLine kLine = kLines.get(i);
                System.out.println("死叉 卖出信号:【"+kLine.getDate()+"】 收盘价:"+kLine.getClose());
            }
        }

        return signals;
    }
}